哈囉大家好~
今天算是要正式開始寫程式碼的起點!那就先從昨天玩的routes和blade template開始吧~
昨天自己試著寫了非常陽春的語錄網頁,利用定義相對的路徑以及blade模版(程式碼如下)
前端畫面顯示:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Hello World! My first Laravel Project!</h1>
</body>
</html>
對應畫面的路徑定義:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/hello', function() {
return view('hello');
});
但其實除了上面的定義路徑方法之外,也可以把切換路徑的邏輯寫在controller裡面,如下所示~
首先在app/Http/Controllers這個目錄夾中創建HomeController.php並撰寫controller控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function index()
{
return view('home');
}
}
?>
這裡用到了物件導向的概念,當呼叫這個類的function時,就會顯示裡面定義的這個"home"的模板畫面。
接下來我們要定義這個畫面的路徑,要回到定義路徑的routes/web.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;#這裡不要忘記引進剛剛寫的Controller喔
Route::get('/home', [HomeController::class, 'index']);
第一個參數'/home'是對應介面顯示的路徑,第二個原本放function的參數,改成放我們定義的HomeController還有返回home畫面的function-index。
最後再建立一個home.blade.php在views目錄中(這裡就不貼上陽春程式碼了XD)
在瀏覽器打開localhost:8000/home就可以看到在home.blade.php撰寫的介面了~
問題很多的我這時候就覺得奇怪,明明第一種方法比較簡單且直觀(還可以少寫一個檔案XD)
為什麼會需要用到Controller呢?俗話說的好,「天生我材必有用!」Controller一定有它存在的意義~
下面就來簡單說明controller和一般routing的差異:
Controller將應用程式的邏輯封裝起來,把邏輯的部份和routing分開。Controller用來將類似的邏輯集合起來,讓程式碼寫起來更有組織架構性,管理起來也較方便。例如:透過model和資料庫互動,回應請求⋯⋯等。將邏輯的部份在controller好,在web.php就可以單純處理回傳畫面的任務。
誒⋯⋯那我怎麼知道什麼時候要用哪一種方式呢?
當然也可以在controller裡面撰寫純回傳路徑對應畫面的程式碼,只不過難免有「殺雞焉用牛刀」的感覺XD
通常如果只是要回傳簡單的文字或畫面,就不寫controller,直接在web.php檔中撰寫function回傳該路徑的blade模版。或是那個畫面只有包含一點點的邏輯,例如靜態網頁。
雖然這個寫法比較簡單直觀,但如果應用程式越長越大,這樣的撰寫方式很容易導致專案程式碼的混亂以及架構參差不齊,沒有模組化的情況下也會導致日後測試的困難。
於是Controller就來幫忙處理複雜的任務啦~
創建controller後,我們就可以重複使用裡面定義的function來幫我們處理重複性的任務,或是幫忙處理對資料庫的增刪修改,也可以處理帶有query的請求。
Controller可以讓測試變得更容易(模組化),在程式碼的維護上也輕鬆許多(例如某個function有bug,只要修改那個function就好,其他function因為保持獨立不受影響)
總而言之,controller將邏輯和routing分開,routes會幫忙把路徑和對應的controller action配對,然後被配對到的controller就會自動處理該任務的邏輯。
除此之外,controller也允許middleware和dependency的注入,讓開發者更容易處理認證和驗證!
為了體驗Controller的強大,決定自己試著在Controller中處理邏輯的部份!
假設我今天想要在路徑後面添加query string "sayMyName",我可以在controller裡面做修改:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function index(Request $request) #Request Object
{
$name = $request->query('sayMyName', 'Heisenberg'); //第二個參數為預設字串
return "Hello, $name~~";
}
}
?>
web.php中定義的路徑:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;#這裡不要忘記引進剛剛寫的Controller喔
Route::get('/home', [HomeController::class, 'index']);
接下來在瀏覽器打開localhost:8000/home?sayMyName=Mary就可以看到Hello, Mary~~
註:如果沒有query string,就會出現預設的第二個參數,也就會看到Hello, Heisenberg~~
那麼今天對於routes和Controller就簡單介紹到這邊啦~
明天要來研究一下blade模版的語法!(想要寫出更漂亮的畫面XD)
希望可以越來越熟悉Laravel的語法~